#include <iostream>
#include <ostream>
#include <vector>
using namespace std;
#define int long long // 66666666666666666666666666666666666666666666
signed main()
{
	// 把马吃了是不是后面的点就能走了？emmm
	int n = 0, m = 0, x = 0, y = 0;
	cin >> n >> m >> x >> y;
	// if (n == 1 || m == 1) // 边界处理
	// {
	// 	cout << 1 << endl;
	// 	return 0;
	// }
	// if (abs(m - x) + abs(n - y) == 3 && m != x && n != y)
	// {
	// 	cout << 0 << endl;
	// 	return 0;
	// }
	// vector<vector<int>> borad(n, vector<int>(m));
	vector<vector<int>> dp(n + 2, vector<int>(m + 2, 0));
	// for (int i = 0; i <= n; ++i)
	// {
	// 	if (abs(i - x) + abs(0 - y) == 3 && i != x && 0 != y)
	// 		break;
	// 	if (x == i && y == 0) // 马也不能走！！！真服了
	// 		break;
	// 	dp[i][0] = 1;
	// }
	// for (int j = 0; j <= m; ++j)
	// {
	// 	if (abs(0 - x) + abs(j - y) == 3 && 0 != x && j != y)
	// 		break;
	// 	if (x == 0 && y == j) // 马也不能走！！！真服了
	// 		break;
	// 	dp[0][j] = 1;
	// }
    dp[0][1] = 1;
    x += 1, y += 1;
	for (int i = 1; i <= n + 1; ++i)
	{
		for (int j = 1; j <= m + 1; ++j)
		{
			if (abs(i - x) + abs(j - y) == 3 && i != x && j != y)
				continue;
			if (x == i && y == j) // 马也不能走！！！真服了
				continue;
			dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
		}
	}
	// for(int i = 0; i <= n; ++i) // DeBug：打印dp矩阵
	// {
	// for(int j = 0; j <= m; ++j)
	// {
	// cout << dp[i][j] << " ";
	// }
	// cout << endl;
	// }
	cout << dp[n + 1][m + 1] << endl;
	return 0;
}